25장. Java와 Kotlin 함께 사용하기
1장에서 코틀린과 자바가
같은 JVM 위에서 돌아간다고 배웠습니다.
그 덕분에 한 프로젝트 안에서
자바와 코틀린을 섞어 쓸 수 있습니다.
실무에서는 이런 상황이 아주 흔합니다.
기존 자바 코드가 잔뜩 있고,
새 코드만 코틀린으로 짜는 경우가 많기 때문입니다.
이 장에서는 코틀린에서
자바 코드를 불러 쓰는 방법을 살펴봅니다.
25.1 Java 코드를 Kotlin에서 호출하기
자바 클래스가 하나 있다고 합시다.
// Java
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
코틀린에서는 마치 코틀린 클래스처럼
그대로 쓸 수 있습니다.
val calc = Calculator()
val sum = calc.add(1, 2)
println(sum) // 3
특별한 변환이나 설정이 필요 없습니다.
그냥 부르면 됩니다.
25.2 Java Getter와 Setter
자바에서는 필드를 감추고
게터/세터로 접근하는 관례가 있습니다.
// Java
public class Person {
private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
코틀린은 이 게터/세터를
프로퍼티처럼 자연스럽게 바꿔 줍니다.
val person = Person()
person.name = "홍길동" // setName() 호출과 같음
println(person.name) // getName() 호출과 같음
getName()을 직접 부를 필요 없이person.name으로 접근할 수 있습니다.
(코틀린 프로퍼티는 7장에서 배웠습니다.)
25.3 Java Collection
자바의 컬렉션도 그대로 쓸 수 있습니다.
다만 한 가지 주의점이 있습니다.
자바 컬렉션에는
“읽기 전용 / 변경 가능“의 구분이 없습니다.
(12장에서 코틀린의 이 구분을 배웠습니다.)
그래서 자바에서 넘어온 List는
코틀린에서 변경 가능한 것으로 취급될 수 있습니다.
val list = javaObject.getItems() // 자바에서 온 List
list.add("새 항목") // 가능할 수 있음(주의)
자바에서 온 컬렉션을 다룰 때는
“내가 이걸 바꿔도 되는가“를
한 번 더 생각하는 습관이 좋습니다.
25.4 SAM Conversion
자바에는 “메서드가 하나뿐인 인터페이스“가 많습니다.Runnable, Comparator 같은 것들입니다.
이런 인터페이스를
SAM 인터페이스라고 합니다.
(SAM = Single Abstract Method)
코틀린에서는 이런 인터페이스를
람다로 간단히 넘길 수 있습니다.
이를 SAM 변환(SAM Conversion)이라고 합니다.
// 익명 객체 대신
val runnable = Runnable {
println("실행")
}
// 자바 메서드에 람다를 바로 넘김
executor.submit {
println("작업 실행")
}
new Runnable() { ... } 같은
긴 코드를 쓰지 않아도 됩니다.
25.5 Checked Exception
23장에서 코틀린에는
검사 예외(Checked Exception)가 없다고 했습니다.
그런데 자바 코드를 부를 때는
그 자바 메서드가 검사 예외를 던질 수 있습니다.
// Java
public String readFile(String path) throws IOException {
// ...
}
자바라면 try-catch가 강제되지만,
코틀린에서는 강제되지 않습니다.
val content = readFile("data.txt") // try-catch 강제 없음
편하긴 하지만,
“이 자바 메서드가 실패할 수 있다“는 사실은
스스로 기억하고 있어야 합니다.
25.6 Platform Type 다시 살펴보기
6장에서 배운 플랫폼 타입을
여기서 다시 만납니다.
자바 메서드가 돌려주는 값은
null일 수도, 아닐 수도 있습니다.
코틀린은 그것을 확실히 알 수 없습니다.
val name = person.name // 타입: String! (플랫폼 타입)
String!는 “null일지 아닐지 코틀린이 모른다“는 표시입니다.
이런 값은 곧바로 쓰기보다
안전하게 다루는 것이 좋습니다.
val safeName: String = person.name ?: "이름 없음"
자바에서 온 값에는?:나 ?.를 적절히 붙여
방어하는 습관을 들이면 좋습니다.
25장을 마치며
이 장에서 우리는 다음을 배웠습니다.
- 자바 클래스를 코틀린에서 그대로 부르는 법
- 자바 게터/세터가 코틀린 프로퍼티처럼 보인다는 점
- 자바 컬렉션에는 읽기 전용 구분이 없다는 점
- SAM 변환으로 자바 인터페이스에 람다를 넘기는 법
- 자바의 검사 예외가 코틀린에서는 강제되지 않는다는 점
- 자바에서 온 값(플랫폼 타입)을 방어적으로 다루기
다음 장에서는 반대 방향,
코틀린 코드를 자바에서 잘 쓰게 만드는 법을 다룹니다.